package com.zhong;

import org.junit.Test;

import java.lang.reflect.Method;

/*
getMethod(String name, Class<?>... parameterTypes)
        根据方法名和参数，返回一个 Method 对象，只能是public
getMethods()
        返回一个 Method 对象数组，只能是public
getDeclaredMethod(String name, Class<?>... parameterTypes)
        根据方法名和参数，返回一个 Method 对象，所有的
getDeclaredMethods()
        返回一个 Method 对象数组，所有的
*/
public class MethodDemo {

    /* jdk动态代理 */
    @Test
    public void demo1() throws Exception{
        Class<?> clazz1 = Class.forName("com.zhong.po.User");

        //返回Field数组，所有的，不包括父类
        Method[] methods = clazz1.getDeclaredMethods();
        for(Method method : methods){
            System.err.println(method.getName());
        }
    }


    /**
     *  返回Field数组，只能是public, 不包括父类
     * @throws Exception
     */
    @Test
    public void demo2() throws Exception{
        Class<?> clazz1 = Class.forName("com.zhong.po.User");

        //返回Field数组，所有的，不包括父类
        Method[] methods = clazz1.getMethods();
        for(Method method : methods){
            System.err.println(method.getName());
        }
    }

    /**
     * 方法的调用
     * @throws Exception
     */
    @Test
    public void demo3() throws Exception{
        Class<?> clazz1 = Class.forName("com.zhong.po.User");
        Object o = clazz1.newInstance();

        //根据名字获取Method对象，只能是public
        Method method1 = clazz1.getMethod("add");
        //调用方法
        Object invoke1 = method1.invoke(o);
        System.err.println(invoke1);

        //根据name返回Field对象，所有的
        Method delete = clazz1.getDeclaredMethod("delete", int.class);
        //将私有的方法，允许方法
        delete.setAccessible(true);
        Object invoke2 = delete.invoke(o, 1);  //方法的调用
        System.err.println(invoke2);
    }

}
